﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PlanoAula.BD;
using PlanoAula.Repository;

namespace PlanoAula
{
    public partial class UnidadeAvaliacaoForm : FormEdicao
    {

        IPlanoAulaCabRepository repositoryPlanoAula;
        IUnidadeAvaliacaoRepository repositoryUnidadeAvaliacao;
        IAvaliacaoRepository repositoryAvaliacao;
        IPlanoAulaDetalheRepository repositoryPlanoAulaDetalhe;

        public UnidadeAvaliacaoForm(Guid idPlanoAula)
            : this(idPlanoAula, new PlanoAulaCabRepository(), new UnidadeAvaliacaoRepository(), new AvaliacaoRepository(), new PlanoAulaDetalheRepository() )
        {
        }
        public UnidadeAvaliacaoForm(Guid idPlanoAula, IPlanoAulaCabRepository repositoryPlanoAulaCab, IUnidadeAvaliacaoRepository repositoryUnidadeAvaliacao, IAvaliacaoRepository repositoryAvaliacao, IPlanoAulaDetalheRepository repositoryPlanoAulaDetalhe)
            : base(idPlanoAula)
        {
            this.repositoryPlanoAulaDetalhe = repositoryPlanoAulaDetalhe;
            this.repositoryAvaliacao = repositoryAvaliacao;
            this.repositoryUnidadeAvaliacao = repositoryUnidadeAvaliacao;
            this.repositoryPlanoAula = repositoryPlanoAulaCab;
            InitializeComponent();
        }
        private void UnidadeAvaliacaoForm_Load(object sender, EventArgs e)
        {
            AtualizarGridUnidade();
            this.MarcarProvaReadOnly(true);
            this.MarcarUnidadeReadOnly(true);
        }

#region Unidade
        private void AtualizarGridUnidade()
        {
            unidadeAvaliacaoBindingSource.DataSource = repositoryUnidadeAvaliacao.GetByKey(IdItem);
        }

        Guid idUnidade = Guid.Empty;
        UnidadeAvaliacao Unidade = null;

        private void atualizarUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AtualizarGridUnidade();
        }
        private void HabilitarAvaliacao(bool habilitar)
        {
            MarcarProvaReadOnly(!habilitar);
            gbxProvas.Enabled = habilitar;
        }
        private void novaUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.idUnidade = Guid.Empty;
            edtNome.Text = "";
            HabilitarAvaliacao(false);
            tabPageUnidade.Focus();
            edtNome.Focus();
            MarcarUnidadeReadOnly(false);
            MarcarProvaReadOnly(true);
        }
        private void SetarCampos(UnidadeAvaliacao unidade)
        {
            if (unidade == null)
                unidade = new UnidadeAvaliacao();
            edtNome.Text = unidade.Nome;
            AtualizarGridProvas(Unidade);
        }
        private void editarUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            UnidadeAvaliacao unidade = unidadeAvaliacaoBindingSource.Current as UnidadeAvaliacao;
            this.idUnidade = unidade.Id;
            SetarCampos(unidade);
            MarcarUnidadeReadOnly(false);
            MarcarProvaReadOnly(true);
        }
        private void excluirUnidadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            repositoryUnidadeAvaliacao.Delete(unidadeAvaliacaoBindingSource.Current.ConvertTo<UnidadeAvaliacao>().Id);
            AtualizarGridUnidade();
        }
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            var planoAula = repositoryPlanoAula.GetByKey(IdItem);
                UnidadeAvaliacao unidade = new UnidadeAvaliacao { Nome = edtNome.Text };
                if (idUnidade != Guid.Empty)
                {
                    unidade = repositoryUnidadeAvaliacao.GetByKey(idUnidade);
                    unidade.Nome = edtNome.Text;
                }
            repositoryUnidadeAvaliacao.Save(unidade);
        
            AtualizarGridUnidade();
            HabilitarAvaliacao(true);
            MarcarUnidadeReadOnly(true);
            MarcarProvaReadOnly(true);
        }

        private void dgvUnidade_DoubleClick(object sender, EventArgs e)
        {
            editarUnidadeToolStripMenuItem_Click(sender, e);
        }
        private void dgvUnidade_SelectionChanged(object sender, EventArgs e)
        {
            MarcarUnidadeReadOnly(true);
            UnidadeAvaliacao unidade = unidadeAvaliacaoBindingSource.Current as UnidadeAvaliacao;
            SetarCampos(unidade);
        }
#endregion Unidade
        private Guid idProva = Guid.Empty;
        private void AtualizarGridProvas(UnidadeAvaliacao Unidade)
        {
            UnidadeAvaliacao unid = (UnidadeAvaliacao)unidadeAvaliacaoBindingSource.Current;
            avaliacaoBindingSource.DataSource = repositoryAvaliacao.ObterAvaliacaoDaUnidade(unid.Id);
        }

        private void btnSalvarProva_Click(object sender, EventArgs e)
        {
#warning tirar daqui e por no repository.

            var unidade = repositoryUnidadeAvaliacao.GetByKey(((UnidadeAvaliacao)unidadeAvaliacaoBindingSource.Current).Id);

            var avaliacao = unidade.Avaliacoes.SingleOrDefault(a => a.Id == idProva);
            if (avaliacao == null)
            {
                avaliacao = new Avaliacao();
                unidade.Avaliacoes.Add(avaliacao);
            }
            avaliacao.NotaMax = notaMaxTextBox.Text.ConvertTo<decimal?>("Informe uma nova no formato 999.99");
            avaliacao.Assuntos = assuntosTextBox.Text;
            avaliacao.DataMarcada = dataMarcadaDateTimePicker.Value.Date;


            var planoAulaDet = repositoryPlanoAulaDetalhe.ObterDetalhesDoPlanoAula(IdItem).SingleOrDefault(p => p.Data == avaliacao.DataMarcada);

            if (planoAulaDet != null)
                avaliacao.PlanoAulaDetalhe = planoAulaDet;
            else
                avaliacao.PlanoAulaDetalhe = null;
            avaliacao.DataRealizacao = dataRealizacaoDateTimePicker.Value.Date;
            avaliacao.Nome = nomeTextBox.Text;
            avaliacao.Observacao = observacaoTextBox.Text;
            avaliacao.Situacao = cmbSituacao.SelectedItem.ToString();

            repositoryPlanoAula.SaveChanges();
            AtualizarGridProvas(unidade);
            MarcarProvaReadOnly(true);
        }
        private void SetarCampos(Avaliacao avaliacao)
        {
            if (avaliacao == null)
            {
                cmbSituacao.SelectedItem = "Aberta";
            }
            else
            {
                cmbSituacao.SelectedItem = avaliacao.Situacao;
            }
            nomeTextBox.Text = avaliacao.Nome;
            assuntosTextBox.Text = avaliacao.Assuntos;
            dataMarcadaDateTimePicker.Value = avaliacao.DataMarcada.GetValueOrDefault(DateTime.Today);
            dataRealizacaoDateTimePicker.Value = avaliacao.DataRealizacao.GetValueOrDefault(DateTime.Now);
            notaMaxTextBox.Text = avaliacao.NotaMax.ToString();
            observacaoTextBox.Text = avaliacao.Observacao;
        }
        private void novaProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.idProva = Guid.Empty;
            SetarCampos(new Avaliacao());
            tabPageAvaliacao.Focus();
            nomeTextBox.Focus();
            MarcarProvaReadOnly(false);

        }

        private void atualizarProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AtualizarGridProvas((UnidadeAvaliacao)unidadeAvaliacaoBindingSource.Current);
        }

        private void editarProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Avaliacao avaliacao = avaliacaoBindingSource.Current as Avaliacao;
            SetarCampos(avaliacao);
            this.idProva = avaliacao.Id;
            MarcarProvaReadOnly(false);
        }

        private void excluirProvaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            repositoryAvaliacao.Delete(avaliacaoBindingSource.Current.ConvertTo<Avaliacao>().Id);
            AtualizarGridUnidade();
        }

       
        private void dgvProvas_DoubleClick(object sender, EventArgs e)
        {
            editarProvaToolStripMenuItem_Click(sender, e);
        }

        

        private void MarcarUnidadeReadOnly(bool readOnly)
        {
            edtNome.ReadOnly = readOnly;
        }

        private void dgvProvas_SelectionChanged(object sender, EventArgs e)
        {
            MarcarProvaReadOnly(true);
            SetarCampos(avaliacaoBindingSource.Current as Avaliacao);
        }

        private void MarcarProvaReadOnly(bool readOnly)
        {
            gbxEdicaoProvas.Enabled = !readOnly;
        }

        private void toolStripButtonVisualizar_Click(object sender, EventArgs e)
        {
#warning reativar depois
            //new Reports.relAvaliacaoForm(IdItem).ExbirFormulario(this);
        }

        private void dataMarcadaDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            if (dataRealizacaoDateTimePicker.Value < dataMarcadaDateTimePicker.Value)
            {
                dataRealizacaoDateTimePicker.Value = dataMarcadaDateTimePicker.Value.AddMonths(2);
            }
        }

        

      

     

       


    }
}
